package day16;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo01 {
	public static void main(String[] args) {
		//		try {
		//			test02(12, 0);
		//		} catch (ArithmeticException e) {
		//			// Java对异常的默认处理方式: 在控制台输出异常的堆栈信息然后终止程序
		//			// e.printStackTrace();
		//			System.out.println("test02方法发生了异常: " + e.getMessage());
		//		}

		//		try {
		//			test03(12, 0);
		//		} catch (Exception e) {
		//			e.printStackTrace();
		//		}

		test04();
	}

	private static void test04() {
		try {
			System.out.println(123);
		} catch (ArithmeticException e) {
			//Unreachable catch block for ArithmeticException. It is already handled by the catch block for Exception
			e.printStackTrace();
		} catch (InputMismatchException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

		try {
			System.out.println(123);
		} catch (ArithmeticException | InputMismatchException e) {
			// JDK1.7起
			// 如果多个异常没有父子级关系, 需要进行统一处理
			// 可以在一个catch中捕捉多个异常
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void test03(int i, int j) throws Exception {
		try {
			int x = i / j;
			System.out.println(x);
		} catch (ArithmeticException e) {
			// e.printStackTrace();
			// 在方法内部, 可以通过`throw`关键字, 抛出一个具体的异常对象
			// 在方法的声明上, 通过`throws`关键字声明方法可能会抛出的异常类型
			throw new Exception();
		}
	}

	// 方法中可能会发生 ArithmeticException 异常
	// 不在方法内部对异常进行捕捉处理
	// 而是将异常抛出, 交给方法的调用者处理
	// 在方法的声明上, 通过`throws`关键字声明方法可能会抛出的异常类型
	private static void test02(int a, int b) throws ArithmeticException {
		int x = a / b;
		System.out.println(x);
	}

	private static void test01() {
		try {
			System.out.println("请输入第一个整数");
			int a = new Scanner(System.in).nextInt();

			System.out.println("请输入第二个整数");
			int b = new Scanner(System.in).nextInt();

			int x = a / b;
			System.out.println(x);
		} catch (ArithmeticException e) {
			System.out.println("代码中发生异常: " + e.getMessage());
		} catch (InputMismatchException e) {
			System.out.println("你的输入不符合要求");
		}
	}
}
